import numpy as np
%matplotlib notebook
import matplotlib.pyplot as plt
import ipywidgets as widgets
from maux import *
hide_interactive_toolbars()
# interaktívny editor pre vyšetrovanie priebehu elementárnych funkcií
from jedit import editor
np.warnings.filterwarnings('ignore', category=np.VisibleDeprecationWarning)
# nastavenie jazyka
from locale import setlocale, LC_ALL
from platform import uname
if uname()[0] == 'Linux':
setlocale(LC_ALL, 'sk_SK.utf8')
else:
setlocale(LC_ALL, 'sk_SK')
plt.rcParams["axes.formatter.use_locale"] = True
V nasledujúcich príkladoch budeme kresliť grafy a vyšetrovať priebeh goniometrických funkcií.
Budeme sa venovať týmto funkciam: $$y = \sin x \\ y = \cos x \\ y = \tan x.$$ Dokumentácia:
Nakreslenie grafu funkcie danej rovnicou $$y = \sin x.$$
#####
##### nakreslenie grafu funkcie
#####
#### vstupné údaje
def f(X): return np.sin(X) # ufunc verzia funkcie
X = np.linspace(-2*np.pi, 4*np.pi, 12*10+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
Y = f(X) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 2) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \sin\,x$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## x-ová os
xtick_numerators = range(-4, 8+1)
ax.set_xticks([n * np.pi / 2 for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2) for n in xtick_numerators]) # označenie kót na x-ovej osi
# ax.set_xticklabels([r'$-2\pi$', r'$-3\pi/2$', r'$-\pi$', r'$-\pi/2$', r'$0$', r'$\pi/2$', r'$\pi$', r'$3\pi/2$', r'$2\pi$', r'$5\pi/2$', r'$3\pi$', r'$7\pi/2$', r'$4\pi$']) # (takmer) to isté, len zapísané iným komplikovanejším spôsobom
## y-ová os
ax.set_ylim(-1.5, 1.5) # ohraničenie hodnôt pre os y
ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi
## graf funkcie
ax.plot(X, Y)
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
#### editor
# editor(figure=fig, axes=ax, function=f, intervals=[X])
Vyšetrenie priebehu funkcie danej rovnicou $$y = \sin x.$$ Tu nás zaujímajú tieto informácie:
#####
##### vyšetrenie priebehu funkcie
#####
#### vstupné údaje
def f(X): return np.sin(X) # ufunc verzia funkcie
X = np.linspace(-2*np.pi, 4*np.pi, 12*10+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
Y = f(X) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 3.5) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Priebeh funkcie $y = \sin\,x$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## x-ová os
xtick_numerators = range(-4, 8+1)
ax.set_xticks([n * np.pi / 2 for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2) for n in xtick_numerators]) # označenie kót na x-ovej osi
## y-ová os
ax.set_ylim(-1.5, 1.5) # ohraničenie hodnôt pre os y
ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi
## nulové body
color = ax.plot([], [], 'kx', label=r"nulový bod")[0].get_color()
for p in [n * np.pi / 2 for n in range(-4, 8+1, 2)]:
ax.plot(p, 0, 'kx', c=color)
## extrémy
ps = [n * np.pi / 2 for n in [-4, -3, -1, 1, 3, 5, 7, 8]] # x-ové súradnice extrémov funkcie vrátane krajných bodov intervalu
color = ax.plot([], [], 'o', label=r"maximum, ostré lokálne maximum")[0].get_color()
for i in [1, 3, 5]:
ax.plot(ps[i], f(ps[i]), 'o', c=color)
color = ax.plot([], [], 'o', label=r"minimum, ostré lokálne minimum")[0].get_color()
for i in [2, 4, 6]:
ax.plot(ps[i], f(ps[i]), 'o', c=color)
## intervaly monotónnosti
color = ax.plot([], [], label=r"rastúca")[0].get_color()
for i in [0, 2, 4, 6]:
I = X[(ps[i] <= X) & (X <= ps[i+1])]
ax.plot(I, f(I), c=color, zorder=1)
color = ax.plot([], [], label=r"klesajúca")[0].get_color()
for i in [1, 3, 5]:
I = X[(ps[i] <= X) & (X <= ps[i+1])]
ax.plot(I, f(I), c=color, zorder=1)
## legenda
# ax.legend()
ax.legend(loc=(0.30, -1.20))
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
Nakreslenie grafu a vyšetrenie nulových bodov funkcie $$y = \sin 2x + \sin\ 4x.$$ Vysvetlenie. Platí $$\sin 2x + \sin 4x = 2 \sin 3x \cos x.$$
#####
##### nulové body funkcie
#####
#### vstupné údaje
def f(X): return np.sin(2 * X) + np.sin(4 * X) # ufunc verzia funkcie
X = np.linspace(-np.pi, 2*np.pi, 3*2*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 6) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \sin\,2x + \sin\,4x$ a jej nulové body") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
ax.set_ylim(-2.2, 2.2) # ohraničenie hodnôt pre os y
## x-ová os
xtick_numerators = range(-6, 12+1)
ax.set_xticks([n * np.pi / 6 for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 6) for n in xtick_numerators]) # označenie kót na x-ovej osi
## y-ová os
ax.set_yticks([-2, -1, 0, 1, 2]) # kótovanie y-ovej osi
## graf funkcie
ax.plot(X, f(X))
# ax.plot(X, 2 * np.sin(3 * X) * np.cos(X))
## nulové body
for k in range(0, 9+1): # nulové body fcie y = sin 3x
ax.plot(-np.pi+k*np.pi/3, 0, 'kx')
for k in range(0, 2+1): # nulové body fcie y = cos x
ax.plot(-np.pi/2+k*np.pi, 0, 'kx')
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
#### editor
# editor(figure=fig, axes=ax, function=f, intervals=[X])
Nakreslenie grafu funkcie sínus $$y = \sin nx$$ do jedného obrázka pre vybrané hodnoty parametra $n = \frac{1}{2}, 1, 2$.
#####
##### grafy parametrického systému funkcií
#####
#### vstupné údaje
def f(X, n): return np.sin(n * X) # ufunc verzia funkcie
X = np.linspace(-2*np.pi, 4*np.pi, 12*10+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 3) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Grafy funkcií $y = \sin\,nx$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## x-ová os
xtick_numerators = range(-4, 8+1)
ax.set_xticks([n * np.pi / 2 for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2) for n in xtick_numerators]) # označenie kót na x-ovej osi
## y-ová os
ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi
## grafy funkcií
for n in [1/2, 1, 2]:
ax.plot(X, f(X, n), label=r"$n = {}$".format(n))
## legenda
# ax.legend()
ax.legend(loc=(0.45, -1.00))
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
To isté ako v predchadzajúcom príklade, len vykreslenie sa deje pomocou interaktívnych prvkov knižnice ipywidgets
.
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####
#### vstupné údaje
def f(X, n): return np.sin(n * X) # ufunc verzia funkcie
X = np.linspace(-2*np.pi, 4*np.pi, 12*10+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 2) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## x-ová os
xtick_numerators = range(-4, 8+1)
ax.set_xticks([n * np.pi / 2 for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2) for n in xtick_numerators]) # označenie kót na x-ovej osi
## y-ová os
ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi
## graf funkcie
def plot_graph(n):
ax.set_title(r"Graf funkcie $y = \sin\,{}x$".format(n)) # pomenovanie diagramu
if ax.lines:
ax.lines[0].set_ydata(f(X, n))
else:
ax.plot(X, f(X, 1))
widgets.interact(plot_graph,
n=widgets.SelectionSlider(options=[1/2, 1, 2], value=1),
)
### samotné zobrazenie
fig.show()
V nasledujúcich príkladoch budeme kresliť grafy a vyšetrovať priebeh goniometrických funkcií. Pretože tieto funkcie majú neohraničený definičný obor, budeme pri zostrojovaní grafu každej takejto funkcie vykreslovať len jej zaujímavú časť. Pri vyšetrovaní jej priebehu treba určiť:
Preferujeme algebraickú metódu pri hľadaní význačných bodov. Súradnice bodov, ktoré sú zrejmé z grafu, netreba explicitne uvádzať.
Doporučujeme tiež rozdeliť riešenie do dvoch častí:
Nakreslite graf a vyšetrite priebeh funkcie $$y = \cos x.$$ Ako zaujímavá časť grafu funkcie si zvoľte interval $\langle -2 \pi, 4 \pi \rangle$ pre hodnoty nezávislej premennej.
Nakreslite graf funkcie kosínus $$y = \cos nx$$ do jedného obrázka pre vybrané hodnoty parametra $n = \frac{1}{2}, 1, 2$.
To isté ako v predchadzajúcom príklade, len vykreslenie nech sa deje pomocou interaktívnych prvkov knižnice ipywidgets
.
Nakreslite do jedného obrázka grafy funkcií $y = \sin x$ a $y = \cos x$.
Nakreslite graf a vyšetrite nulové body funkcie $$y = \cos\, 5x - \cos\ x.$$ Ako zaujímavá časť grafu funkcie si zvoľte interval $\langle - \pi, \pi \rangle$ pre hodnoty nezávislej premennej.
Nakreslite graf funkcie $$y = \sin 20x + \sin 22x.$$ Ako zaujímavá časť grafu funkcie si zvoľte interval $\langle - \pi, 2 \pi \rangle$ pre hodnoty nezávislej premennej.
To isté ako v predchadzajúcich dvoch príkladoch, ale tentokrát pre funkciu
$$y = \sin\, ax + \sin\ bx,$$
kde parametre nadobúdajú hodnoty
$a \in \{1, \ldots, 20\}$ a $b \in \{1, \ldots, 22\}$.
Vykreslenie sa deje pomocou interaktívnych prvkov knižnice ipywidgets
.
#####
##### grafy parametrického systému funkcií (interaktívna verzia)
#####
#### vstupné údaje
def f(a, b): return np.sin(a*X) + np.sin(b*X) # ufunc verzia funkcie
X = np.linspace(-np.pi, 2*np.pi, 6*42*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 6) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## x-ová os
xtick_numerators = range(-2, 4+1)
ax.set_xticks([n * np.pi / 2 for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2) for n in xtick_numerators]) # označenie kót na x-ovej osi
## y-ová os
ax.set_ylim(-2.2, 2.2) # ohraničenie hodnôt pre os y
ax.set_yticks([-2, -1, 0, 1, 2]) # kótovanie y-ovej osi
## graf funkcie
def plot_graph(a, b):
ax.set_title(r"Graf funkcie $y = \sin\,{0}x + \sin\,{1}x$".format(a,b)) # pomenovanie diagramu
if ax.lines:
ax.lines[0].set_ydata(f(a, b))
else:
ax.plot(X, f(2, 4))
widgets.interact(plot_graph,
a=widgets.IntSlider(min=1,max=20,step=1,value=2),
b=widgets.IntSlider(min=1,max=22,step=1,value=4))
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
Nakreslenie grafu funkcie $$y = \tan x$$ Definičným oborom je množina všetkých reálnych čísel $x$, pre ktoré $\cos x \ne 0$, t. j. množina $$R \setminus \left\{\frac{(2n+1)\pi}{2} \mathbin{;} n \in Z\right\}.$$ Obrázok obsahuje tiež asymptoty bez smernice grafu funkcie.
#####
##### nakreslenie grafu funkcie
#####
#### vstupné údaje
def f(X): return np.tan(X) # ufunc verzia funkcie
X = np.linspace(-(5/2)*np.pi, (5/2)*np.pi, 10*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 9) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \tan\,x$") # pomenovanie diagramu
ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## x-ová os
xtick_numerators = range(-5, 5+1)
ax.set_xticks([n * np.pi / 2 for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2) for n in xtick_numerators]) # označenie kót na x-ovej osi
## y-ová os
ax.set_ylim(-5, 5) # ohraničenie hodnôt pre os y
## graf funkcie
color = ax.plot([], [])[0].get_color()
for n in range(-5, 5, 2):
I = X[(n*np.pi/2 < X) & (X < (n+2)*np.pi/2)]
ax.plot(I, f(I), c=color)
## asymptoty bez smernice
Ay = np.linspace(-5, 5)
for n in range(-5, 5+1, 2):
Ax = np.ones(len(Ay)) * n * np.pi/2
ax.plot(Ax, Ay, 'k--', lw=1)
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
Úprava predpisu funkcie $$y = \sin 2x - \sqrt{3} \cos 2x$$ na tvar sínusoidy $$y = A \sin(\omega x \pm \varphi),$$ kde $A > 0$, $\omega > 0$, $\varphi \geq 0$. Graficke overenie správnosti riešenia.
Vysvetlenie. Platí $$ \sin 2x - \sqrt{3} \cos 2x = 2 \left( \sin 2x \cdot \frac{1}{2} - \cos 2x \cdot \frac{\sqrt{3}}{2} \right) = 2 \left( \sin 2x \cos \frac{\pi}{3} - \cos 2x \sin \frac{\pi}{3} \right) = 2 \sin \left( 2x - \frac{\pi}{3} \right). $$
###
### úprava predpisu funkcie
###
## zadanie
fig, ax = plt.subplots()
fig.set_size_inches(9, 5)
init_subplot(ax)
ax.set_title(r"Úprava predpisu funkcie na tvar sínusoidy")
ax.set_aspect('equal')
# ax.grid()
xtick_numerators = range(-4, 4+1)
ax.set_xticks([n * np.pi / 2 for n in xtick_numerators])
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 2) for n in xtick_numerators])
def f(X): return np.sin(2 * X) - np.sqrt(3) * np.cos(2 * X)
X = np.linspace(-2*np.pi, 2*np.pi, 4*2*100+1)
ax.plot(X, f(X), c='yellow', lw='5', alpha=0.5, label=r"zadanie $y = \sin\,2x - \sqrt{3} \cos\,2x$")
## riešenie
A = 2 # tento údaj upravte, A > 0
omega = 2 # tento údaj upravte, omega > 0
phi = np.pi / 3 # tento údaj upravte, phi ≥ 0
# def g(X): return A * np.sin(omega * X - phi) # vyberte si buď tento
def g(X): return A * np.sin(omega * X - phi) # alebo tento prípad
ax.plot(X, g(X), label=r"riešenie $y = 2 \sin \left( 2x - \frac{\pi}{3} \right)$") # tento údaj upravte
## dokončenie
#ax.legend()
ax.legend(loc=(0.33, -0.35))
# fig.savefig("<meno súboru>.png")
fig.show()
Upravte predpis funkcie $$y = \cos 3x + \sin 3x$$ na tvar sínusoidy $$y = A \sin(\omega x \pm \varphi),$$ kde $A > 0$, $\omega > 0$, $\varphi \geq 0$. Overte graficky, že riešenie je správne.
###
### šablóna riešenia
###
## zadanie
fig, ax = plt.subplots()
fig.set_size_inches(9, 4)
init_subplot(ax)
ax.set_title(r"Úprava predpisu funkcie na tvar sínusoidy")
ax.set_aspect('equal')
# ax.grid()
xtick_numerators = range(-6, 6+1)
ax.set_xticks([n * np.pi / 3 for n in xtick_numerators])
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 3) for n in xtick_numerators])
def f(X): return np.cos(3 * X) + np.sin(3 * X)
X = np.linspace(-2*np.pi, 2*np.pi, 2*6*100+1)
ax.plot(X, f(X), c='yellow', lw='5', alpha=0.5, label=r"zadanie $y = \cos\,3x + \sin\,3x$")
## riešenie
A = 1 # tento údaj upravte, A > 0
omega = 1 # tento údaj upravte, omega > 0
phi = 0 # tento údaj upravte, phi ≥ 0
def g(X): return A * np.sin(omega * X + phi) # vyberte si buď tento
# def g(X): return A * np.sin(omega * X - phi) # alebo tento prípad
ax.plot(X, g(X), label=r"riešenie $y = ? \sin(? x \pm ? )$") # tento údaj upravte
## dokončenie
# ax.legend()
ax.legend(loc=(0.33, -0.5))
# fig.savefig("<meno súboru>.png")
fig.show()
Nakreslenie grafu funkcie $$y = \frac{\sin x}{x}.$$ Definičným oborom je množina pozostávajúca zo všetkých reálnych čísel rôznych od $0$.
#####
##### nakreslenie grafu funkcie
#####
#### vstupné údaje
def f(X): return np.sin(X) / X # ufunc verzia funkcie
X = np.linspace(-4*np.pi, 4*np.pi, 8*100+1) # výber hodnôt nezávislej premennej pre zaujímavú časť grafu
X1, X2 = X[X < 0], X[X > 0] # číslo 0 nepatrí do oboru definície
Y1, Y2 = f(X1), f(X2) # odpovedajúce hodnoty závislej premennej
#### obrázok s jedným diagramom
fig, ax = plt.subplots()
fig.set_size_inches(9, 3.5) # veľkosť obrázka (východzia hodnota je 6x4)
### diagram
init_subplot(ax) # inicializácia diagramu: vytvorí sa pravoúhla súradnicová sústava
ax.set_title(r"Graf funkcie $y = \dfrac{\sin\,x}{x}$", fontdict={'verticalalignment': 'bottom'}) # pomenovanie diagramu
# ax.set_aspect('equal') # nastavenie rovnakej mierky pre obe osi
ax.set_aspect(2*np.pi) # nastavenie rôznej mierky pre obe osi
# ax.grid() # pravoúhla sieť
## x-ová os
xtick_numerators = range(-4, 4+1)
ax.set_xticks([n * np.pi / 1 for n in xtick_numerators]) # kótovanie x-ovej osi
ax.set_xticklabels([smart_ticklabel(n, r"\pi", 1) for n in xtick_numerators]) # označenie kót na x-ovej osi
## y-ová os
# ax.set_yticks([-1, 0, 1]) # kótovanie y-ovej osi
## graf funkcie
color = ax.plot([], [])[0].get_color()
ax.plot(X1, Y1, c=color)
ax.plot(X2, Y2, c=color)
ax.plot(0, 1, 'o', c=color, mfc='w') # číslo 0 nepatrí do oboru definície
### archivácia obrázka
# fig.savefig("<meno súboru>.png")
### samotné zobrazenie
fig.show()
#### editor
# editor(figure=fig, axes=ax, function=f, intervals=[X1, X2])